package com.bookocean.domain.utils;

/**
 * 用户上下文持有者
 * 使用 ThreadLocal 存储当前请求的用户信息
 * 
 * @author BookOcean
 * @since 2024-01-01
 */
public class UserContextHolder {

    /**
     * 存储当前线程的用户ID
     */
    private static final ThreadLocal<Long> USER_ID_HOLDER = new ThreadLocal<>();

    /**
     * 存储当前线程的用户openid
     */
    private static final ThreadLocal<String> OPENID_HOLDER = new ThreadLocal<>();

    /**
     * 设置当前用户ID
     * 
     * @param userId 用户ID
     */
    public static void setUserId(Long userId) {
        USER_ID_HOLDER.set(userId);
    }

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID
     */
    public static Long getUserId() {
        return USER_ID_HOLDER.get();
    }

    /**
     * 设置当前用户openid
     * 
     * @param openid 用户openid
     */
    public static void setOpenid(String openid) {
        OPENID_HOLDER.set(openid);
    }

    /**
     * 获取当前用户openid
     * 
     * @return openid
     */
    public static String getOpenid() {
        return OPENID_HOLDER.get();
    }

    /**
     * 清除当前线程的用户信息
     * 在请求结束时必须调用，避免内存泄漏
     */
    public static void clear() {
        USER_ID_HOLDER.remove();
        OPENID_HOLDER.remove();
    }

    /**
     * 检查当前是否有用户登录
     * 
     * @return 是否已登录
     */
    public static boolean isLoggedIn() {
        return USER_ID_HOLDER.get() != null;
    }
}
